import java.util.ArrayList;
import java.util.List;

/**
 * 191. 位1的个数
 * https://leetcode-cn.com/problems/number-of-1-bits/
 */
public class Solutions_191 {
    public static void main(String[] args) {
        // 使用 0b 来表示数字串是二进制形式的 int 值
        int num1 = 0b00000000000000000000000000001011;  // output: 3
        int num2 = 0b00000000000000000000000010000000;  // output: 1
        int num3 = 0b11111111111111111111111111111101;  // output: 31

        List<Integer> inputs = new ArrayList<>();
        inputs.add(num1);
        inputs.add(num2);
        inputs.add(num3);

        for (int input : inputs) {
            int result = hammingWeight(input);
            System.out.println(result);
        }
    }

    /**
     * 共循环 32 次
     * 10111 & 10000 = 10000，说明右侧第 5 位上为 1
     */
    public static int hammingWeight(int n) {
        int res = 0;
        for (int i = 0; i < 32; i++) {
            int num = 1 << i;
            if ((n & num) == num) {
                res ++;
            }
        }
        return res;
    }

    /**
     * 每次右移 1 位
     */
    public static int hammingWeight2(int n) {
        int res = 0;
        while (n != 0) {
            if ((n & 1) == 1) {
                res ++;
            }
            // 使用无符号右移
            n = n >>> 1;
        }
        return res;
    }
}
